package com.party.core.dao.read.crowdfund;

import com.party.common.paging.Page;
import com.party.core.dao.read.BaseReadDao;
import com.party.core.model.crowdfund.*;
import com.party.core.model.member.Member;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 众筹项目数据读取
 * Created by wei.li
 *
 * @date 2017/2/16 0016
 * @time 17:04
 */
@Repository
public interface ProjectReadDao extends BaseReadDao<Project> {


    /**
     * 联合查询支持
     * @param param 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<Project> listWithSupportPage(@Param(value = "param") HashMap<String, Object> param, Page page);

    /**
     * 联合查询创建者
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<ProjectWithAuthor> listWithAuthorPage(ProjectWithAuthor projectWithAuthor, Page page);

    /**
     * @param projectWithAuthor
     * @param params
     * @param page
     * @return java.util.List<com.party.core.model.crowdfund.ProjectWithAuthor>
     * @Author yifeng
     * @Description 阶段众筹列表（数据查看）
     * @Date 17:42
     **/
    List<ProjectWithAuthorOutput> listForActGradation(@Param(value = "project") ProjectWithAuthor projectWithAuthor,
                                                @Param(value = "params") Map<String,Object> params,
                                                Page page);

    /**
     * 联合查询创建者
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<ProjectWithAuthor> listForDistributorId(ProjectWithAuthor projectWithAuthor, Page page);


    /**
     * 获取包含创建者项目信息
     * @param id 编号
     * @return 项目信息
     */
    ProjectWithAuthor getWithAuthor(String id);

    /**
     * 根据分销编号查询众筹项目
     * @param distributionId 分销编号
     * @return 众筹项目列表
     */
    List<Project> listForDistributionId(@Param(value = "distributionId") String distributionId);

    /**
     * 根据目标查询众筹项目
     * @param targetId 目标编号
     * @return 项目列表
     */
    List<Project> listForTargetId(@Param(value = "targetId") String targetId);

    Double getTotalAmountForTargetId(@Param(value = "targetId") String targetId);


    /**
     * 查询众筹项目列表
     * @param param 参数
     * @param page 分页
     * @return 众筹列表
     */
    List<ProjectWithAuthor> list(@Param(value = "param") HashMap<String, Object> param, Page page);

    /**
     * 项目下众筹数
     * @param targetId 项目编号
     * @return 众筹数
     */
    Integer sizeForTargetId(@Param(value = "targetId") String targetId,
                            @Param(value = "isSuccess") Integer isSuccess,
                            @Param("relationId") String relationId);


    /**
     * 项目下直接众筹数
     * @param targetId
     * @param isSuccess
     * @param payType
     * @return
     */
    Integer directPaySizeForTargetId(@Param(value = "targetId") String targetId, @Param(value = "isSuccess") Integer isSuccess,@Param("payType") Integer payType);


    /**
     * 根据事件编号查询众筹数
     * @param eventId 事件编号
     * @return 众筹数
     */
    Integer countForEvent(@Param(value = "eventId") String eventId, @Param(value = "isSuccess") Integer isSuccess);

    /**
     * 根据事件编号查询直接付款众筹数
     * @param eventId 事件编号
     * @return 众筹数
     */
    Integer dpCountForEvent(@Param(value = "eventId") String eventId, @Param(value = "isSuccess") Integer isSuccess);

    /**
     * 众筹分析列表
     * @param param 参数
     * @param page 分页参数
     * @return 分析列表
     */
    List<ProjectAnalyze> analyzeList(@Param(value = "param") HashMap<String, Object> param, Page page);


    /**
     * 众筹支持总和
     * @param targetId 目标编号
     * @return 支持者总和
     */
    Integer sumfavorerNum(@Param(value = "targetId") String targetId);

    /**
     * 支持者众筹人数
     * @param eventId 事件编号
     * @param targetId 目标编号
     * @param projectId 项目编号
     * @return 众筹人数
     */
    Integer numOfSupport(@Param(value = "eventId") String eventId,
                         @Param(value = "targetId") String targetId,
                         @Param(value = "projectId") String projectId);

    /**
     * 众筹统计
     * @param parameter 统计参数
     * @return 统计结果
     */
    Integer count(@Param(value = "parameter") HashMap<String, Object> parameter);

    Double sumForActualAmount(@Param(value = "param") HashMap<String,Object> param);

    /**
     * 获取初始化众筹用时的数据
     * @return
     */
    List<Project> getInitUseTimeData();

    /**
     * 众筹统计每天众筹成功人数
     *
     * @param parameter 统计参数
     * @return
     */
    Integer countByDate(@Param(value = "parameter") HashMap<String, Object> parameter);


    /**
     * 统计众筹项目下的浏览量
     * @param targetId 目标编号
     * @return 浏览量
     */
    Integer viewNumForTargetId(@Param(value = "targetId") String targetId);

    /**
     * 根据用户和项目id获取众筹
     * @param targetId 项目id
     * @param authorId 用户id
     * @return
     */
    Project findByTargetWithAuthor(@Param(value = "targetId") String targetId, @Param(value = "authorId") String authorId);

    /**
     * 查询某机构下的所有众筹名者
     * @param partnerId
     * @return
     */
    List<Member> getZcMembersByPartnerId(@Param(value = "partnerId") String partnerId);

    /**
     * 按分组查到某机构某会员的众筹数和众筹金额(众筹中和众筹成功的)
     * @return
     */
    List<Map<String, Object>> getAllGroup(@Param(value = "status") Integer status,
                                          @Param(value = "partnerId") String partnerId,
                                          @Param(value = "memberId") String memberId);

    /**
     * 根据主题编号查找众筹
     * @param eventId 主题编号
     * @param activityId 活动编号
     * @param authorId 发布者
     * @return 众筹列表
     */
    List<Project> findByEvent(@Param(value = "eventId") String eventId,
                              @Param("activityId") String activityId,
                              @Param(value = "authorId") String authorId);

    /**
     * 数据分析的统计
     * @param startDate
     * @param endDate
     * @return
     */
    Map<String, Object> countAnalyzeByDate(@Param("startDate") String startDate,
                                           @Param(value = "endDate") String endDate,
                                           @Param("params") Map<String, Object> params);
    /**
     * 根据当前项目id和目标编号获取已报名且众筹状态正确的众筹
     * @param targetId 目标编号
     * @param sourceId 当前项目id
     * @return 众筹列表
     */
    List<ProjectBatchTransfer> findByTargetWithSource(@Param(value = "targetId") String targetId, @Param(value = "sourceId") String sourceId);

    /**
     * 根据当前项目id和目标编号获取未报名的
     * @param targetId 目标编号
     * @param sourceId 当前项目id
     * @return 众筹列表
     */
    List<Project> findByTargetWithSourceNotInvolved(@Param(value = "targetId") String targetId, @Param(value = "sourceId") String sourceId);

    /**
     * 数据报表
     * @param input
     * @return
     */
    ProjectDetailCountOutput getDataTable(ProjectDetailCountInput input);

    /**
     * 合作商某天的众筹成功人数
     * @param successDate
     * @param partnerId
     * @return
     */
    Integer countBySuccessDate(@Param("successDate") Date successDate, @Param("partnerId") String partnerId);

    /**
     * 根据用户编号查询众筹
     * @param authorId 用户编号
     * @param eventId 主题编号
     * @return 众筹列表
     */
    List<Project> listForAuthorId(@Param("authorId") String authorId, @Param("eventId") String eventId);

    /**
     * 根据用户编号查询项目发布者
     *
     * @param authorId 用户编号
     * @return 项目发布者编号集合
     */
    List<String> getPartnerIdByAuthorId(@Param("authorId") String authorId);


    /**
     * 联合查询创建者
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<ProjectWithAuthor> listTransferWithAuthorPage(ProjectWithAuthor projectWithAuthor, Page page);

    /**
     * 根据支付订单id获取众筹者信息
     *
     * @param orderId 订单id
     * @return 众筹者信息
     */
    ProjectWithAuthor getProjectAuthorByOrder(@Param("orderId") String orderId);

    /**
     * 分销众筹成功统计数
     * @param parameter 查询参数
     * @return 众筹成功人数
     */
    Integer disCount(@Param(value = "parameter") HashMap<String, Object> parameter);

    List<String> findByOpenId(@Param("openId") String openId);

    /**
     * 获取我的众筹
     * @param targetId 项目id
     * @param authorId 用户id
     * @return
     */
    Project getMyProject(@Param("targetId") String targetId, @Param("authorId") String authorId);


    List<Project> inits();

    /***
     * 根据项目id找该项目下所有的报名者
     * @param targetId
     * @return
     */
    List<Project> getProjectByActivityId(@Param("targetId")String targetId,Page page);

    /***
     * 根据项目id 获取主题下面所有的报名人员
     * @param eventId
     * @param page
     * @return
     */
    List<Project> queryProjectByTargetId(String eventId, Page page);

    /***
     * 个人排行榜
     * @param targetId
     * @param page
     * @return
     */
    List<Project> popularityList(@Param("targetId")String targetId, Page page,@Param("type")String type);

    /***
     * 个人排行榜  自己的个人信息
     * @param targetId
     * @param
     * @return
     */
    Project popularity(@Param("targetId")String targetId, @Param("memberId")String memberId, @Param("type")String type);

    Project getByMemberId(@Param("targetId")String targetId, @Param("memberId")String memberId);

    /***
     * 根据项目id和supportId 找报名者
     * @param supportId
     * @param targetId
     * @return
     */
    Project getProjectByMemberId(@Param("supportId")String supportId, @Param("targetId")String targetId);

    /***
     * 获取项目或者活动的总金额
     * @param param
     * @return
     */
    Double sumProjectOREventAmount(@Param(value = "param") HashMap<String,Object> param);

    List<ProjectWithAuthor> listForMySupport(ProjectWithAuthor projectWithAuthor, Page page);

    /***
     * 众筹者转移初始化LastSupportDate
     * @return
     */
    List<Project> transferLastSupportDate();

    /**
     * 联合查询创建者__多场
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<ProjectWithAuthor> gradationListWithAuthorPage(ProjectWithAuthor projectWithAuthor, Page page);

   /**
   * @Author hzq
   * @Description //找到这个活动下面的所有报名人员
   * @Date 17:59 2019/4/10
   * @param eventId
   * @return
   **/
    List<Project> findByEventId(String eventId);

    /**
     * @param projectId 众筹id
     * @return
     * @Author yifeng
     * @Description 获取众筹的累计金额和支持数量
     * @Date 13:57 2019/4/12
     **/
    Project getSupportMoneyAndCount(@Param(value = "projectId") String projectId);

    /**
     * 统计众筹项目下的浏览量
     * @param eventId 目标编号
     * @return 浏览量
     */
    Integer viewNumForEventId(String eventId);

    List<CrowdfundingBattleReport> getProjectBattleReport(@Param(value = "param")Map<String,Object> param
            ,@Param(value = "type")Integer type);
}
